#ifndef __RamPoda__
#define __RamPoda__

#include <map>
#include <queue>
#include <list>
#include <vector>
#include <iostream>
#include <utility>
#include <fstream>
#include <cstdlib>
#include "AnalizadorDatos.h"
#include <functional>



class RamPoda
{
    public:
        RamPoda(string nomFich);
        void RamPodaSol();
        DatosProblema* getDatosProblema();
        Nodo getNodo();
    protected:
        int Voraz();
        void NodoInicial(Nodo);
        virtual void Anyadir(Nodo){};
        virtual Nodo Extraer(){};
        virtual bool EsVacio(){};
        void PonerCota(int);
        int Expandir(Nodo);
        bool Aceptable(Nodo);
        bool Factible(Nodo);
        bool Solucion(Nodo);
        int Valor(Nodo);
        int ValorDeCota(Nodo);
    private:
        Nodo mejor_sol;
        deque<Nodo> Hijos;
        int ValorInicialDeCota;
        DatosProblema DP;
};


class RamPodaVector : public RamPoda
{
    public:
        RamPodaVector(string);
    protected:
        void Anyadir(Nodo);
        Nodo Extraer();
        bool EsVacio();
    private:
        vector<Nodo> NV;
};


class RamPodaLista : public RamPoda
{
    public:
        RamPodaLista(string);
    protected:
        void Anyadir(Nodo);
        Nodo Extraer();
        bool EsVacio();
    private:
        list<Nodo> NV;
};


class RamPodaQueue : public RamPoda
{
    public:
        RamPodaQueue(string);
    protected:
        void Anyadir(Nodo);
        Nodo Extraer();
        bool EsVacio();
    private:
        priority_queue<Nodo,vector<Nodo>,less<Nodo> > NV;
};

#endif
